import {
  ToolbarInfo,
  ICmdProps,
  ToolBarGroup,
} from '@/components/CmdBar/CmdBottomBtn/type';
import { useCmdStore } from '../store/cmdStore';
export class ToolbarMamager {
  private toolbarCmds: { [key: string]: ICmdProps } = {};
  addToolbarCmds(cmd: ICmdProps) {
    this.toolbarCmds[cmd.id] = cmd;
    this.eventsToolbarCmds(cmd, false);
  }
  // 遍历工具栏命令
  forEachToolbarCmds(params: ToolbarInfo) {
    for (const key in this.toolbarCmds) {
      this.toolbarCmds[key]?.callback?.(
        params,
        this.toolbarCmds[params.target],
      );
    }
  }
  changeToolbarCmds(selected: boolean, cmd: ICmdProps) {
    if (selected) {
      setTimeout(() => {
        cmd.invoke?.(cmd);
        this.eventsToolbarCmds(cmd, selected);
      });
    } else {
      cmd.exit?.();
      this.eventsToolbarCmds(cmd, selected);
    }
  }
  eventsToolbarCmds(cmd: ICmdProps, selected: boolean) {
    if (cmd?.events) {
      this.forEachToolbarCmds({
        target: cmd.id,
        event: cmd.events,
        selected,
      });
    }
  }
  // 获取所有工具栏命令
  getToolbarCmds() {
    return this.toolbarCmds;
  }
  // ----------------- toolbar 状态管理 -------------------
  /**
   * 设置指定命令的参数。
   *
   * @param id - 命令的唯一标识符。
   * @param params - 要为该命令设置的参数。这里使用了泛型T，以避免使用any类型，提高类型安全性。
   */
  setCmdParams(id: string, params: any) {
    const cmdParams = useCmdStore.getState().cmdParams;
    cmdParams[id] = params;
    useCmdStore.getState().setCmdParams({ ...cmdParams });
  }
  getCmdParam(id: string) {
    return useCmdStore.getState().cmdParams[id];
  }
  /**
   * 设置互斥组的值。
   *
   * @param group - 互斥组的名称。
   * @param val - 要设置的值。
   * */
  setMutualExclusion(group, val: string) {
    // this.getMutualExclusion()[group] = val;
    const mutualExclusion = this.getMutualExclusion();
    mutualExclusion[group || ToolBarGroup.DEFAULT] = val;
    useCmdStore.getState().setMutualExclusion({ ...mutualExclusion });
  }
  /**
   * 设置独立组的值。
   *
   * @param val - 要设置的值。
   * @param keep - 可选参数，指示是否保持当前值。
   * */
  changeIndependent(val: string, selected?: boolean, keep?: boolean) {
    if (keep) {
      return;
    }
    const independent = new Set(this.getIndependent());
    if (independent.has(val)) {
      const flag = selected ?? false;
      !flag && independent.delete(val);
    } else {
      const flag = selected ?? true;
      flag && independent.add(val);
    }
    useCmdStore.getState().setIndependent([...independent]);
  }
  /**
   * 检查指定值是否选中。
   *
   * @param group - 互斥组的名称。
   * @param val - 要检查的值。
   * @returns 一个布尔值，指示值是否选中。
   * */
  isActive(group, val: string) {
    return (
      this.getIndependent().includes(val) ||
      this.getMutualExclusion()[group || ToolBarGroup.DEFAULT] === val
    );
  }
  /**
   * 获取所有命令的参数。
   * @returns 一个对象，包含所有命令的参数。
   * */
  getCmdParams() {
    return useCmdStore.getState().cmdParams;
  }
  /**
   * 获取独立组的值。
   * @returns 一个对象，包含所有互斥组的值。
   * */
  getIndependent() {
    return useCmdStore.getState().independent;
  }
  /**
   * 获取互斥组的值。
   * @returns 一个对象，包含所有互斥组的值。
   * */
  getMutualExclusion() {
    return useCmdStore.getState().mutualExclusion;
  }
  // -----------------------------------
}
export const toolbarMamager = new ToolbarMamager();
